package com.lcx.movie.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lcx.movie.common.Rep;
import com.lcx.movie.entity.Schedule;
import com.lcx.movie.entity.ScheduleSeat;
import com.lcx.movie.service.ScheduleSeatService;
import com.lcx.movie.service.ScheduleService;
import net.minidev.json.JSONObject;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 李丽君
 * @version 1.0
 * @Description 场次控制类
 * @date 2025/2/13 15:33
 */
@CrossOrigin(origins = "*")
@RestController
public class ScheduleController {
    @Autowired
    private ScheduleService scheduleService;
    @Autowired
    private ScheduleSeatService scheduleSeatService;

    /**
     * 分页查询所有场次信息[后台管理]
     * @param movieCnName 电影名称
     * @return 场次数据集合
     */
    @GetMapping("/selectPageBySchedule/{page}")
    public Rep selectPageBySchedule(@PathVariable("page") int page, @RequestParam(required = false) String movieCnName) {
        // 开启分页
        PageHelper.startPage(page, 10);
        // 执行查询
        List<Schedule> scheduleList = this.scheduleService.selectPageBySchedule(movieCnName);
        PageInfo<Schedule> schedulePageInfo = new PageInfo<>(scheduleList);
        return new Rep().addData("schedulePageInfo", schedulePageInfo);
    }
    /**
     * 添加场次
     *
     * 此方法用于处理添加新场次的请求，包括创建排片信息和相关座位信息
     * 它接收一个JSON字符串作为输入，该字符串包含排片信息和座位列表
     * 方法首先解析JSON字符串，然后将排片信息插入数据库，并批量插入座位信息
     *
     * @param json 包含排片和座位信息的JSON字符串
     * @return 返回一个表示操作结果的字符串，"新增场次成功"或"新增场次失败"
     * @throws JsonProcessingException 如果JSON处理过程中发生错误
     */
    @PostMapping("/insertSchedule")
    public String insertSchedule(@RequestBody String json) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(json);
        // 将 schedule 转换为 Schedule 对象
        Schedule schedule =objectMapper.treeToValue(rootNode.get("schedule"), Schedule.class);
        System.out.println("schedule = " + schedule);
        // 插入排片信息
        int insertedSchedule = this.scheduleService.insertSchedule(schedule);
        // 查询自增的 id
        System.out.println("schedule.getScheduleId() = " + schedule.getScheduleId());
        // 处理对象集合
        List<ScheduleSeat> scheduleSeatList = new ArrayList<>();
        for (JsonNode node : rootNode.get("scheduleSeatList")) {
            // 移除 "moved" 字段
            ((ObjectNode) node).remove("moved");
            ScheduleSeat user = objectMapper.treeToValue(node, ScheduleSeat.class);
            user.setScheduleId(schedule.getScheduleId());
            scheduleSeatList.add(user);
        }
        // 批量新增座位
        scheduleSeatService.saveBatch(scheduleSeatList);

        System.out.println(scheduleSeatList);
        return insertedSchedule > 0 ? "新增场次成功" : "新增场次失败";
    }


    /**
     * 根据影院ID和电影ID查询排片信息
     *
     * @param cinema_id 影院ID
     * @param movie_id 电影ID
     * @return 包含排片信息的JSON对象
     */
    @PostMapping("/findScheduleByCinemaAndMovie")
    public JSONObject findScheduleByCinemaAndMovie(@Param("cinema_id") long cinema_id, @Param("movie_id") long movie_id) {
        // 打印影院ID和电影ID以便调试
        System.out.println("cinema_id = " + cinema_id);
        System.out.println("movie_id = " + movie_id);

        // 初始化一个空的JSON对象用于存储查询结果
        JSONObject obj = new JSONObject();

        // 调用服务层方法查询符合条件的排片列表
        List<Schedule> list = scheduleService.findScheduleByCineamIdAndMovieId(cinema_id, movie_id);

        // 将查询结果封装到JSON对象中
        obj.put("code", 0); // 状态码，0表示成功
        obj.put("count", list.size()); // 排片数量
        obj.put("data", list); // 排片列表

        // 返回封装了查询结果的JSON对象
        return obj;
    }

    /**
     * 根据影厅id查询所有的场次
     *
     * @param hallId 影厅id
     * @return 场次集合
     */
    @GetMapping("/selectScheduleByHallId")
    public Rep selectScheduleByHallId(@Param("page") Integer page, @Param("pageSize") Integer pageSize, @Param("hallId") Integer hallId) {
        // 开启分页
        PageHelper.startPage(page, pageSize);
        // 执行查询
        List<Schedule> scheduleList = this.scheduleService.selectScheduleByHallId(hallId);
        PageInfo<Schedule> schedulePageInfo = new PageInfo<>(scheduleList);
        return new Rep().addData("schedulePageInfo", schedulePageInfo);
    }


    /**
     * 根据放映厅查询场次
     * @param scheduleId 场次id
     * @return JsonObject对象
     */
    @PostMapping("selectScheduleByHallIds")
    public JSONObject selectScheduleByHallIds(@Param("scheduleId") Integer scheduleId) {
        // 打印传入的 scheduleId 用于调试
        System.out.println("scheduleId = " + scheduleId);

        // 创建一个新的 JSON 对象，用于封装返回数据
        JSONObject obj = new JSONObject();

        // 根据传入的 scheduleId 查询对应的场次信息
        Schedule schedule = scheduleService.findScheduleById(scheduleId);

        // 将查询到的场次信息放入 JSON 对象中，键名为 "data"
        obj.put("data", schedule);

        // 返回封装好的 JSON 对象
        return obj;
    }

    /**
     * 根据场次id删除场次
     *
     * @param scheduleId 场次id
     * @return 受影响的行数
     */
    @GetMapping("/deleteSchedule")
    public String deleteSchedule(@Param("scheduleId") Integer scheduleId) {
        int deleteSchedule = scheduleService.deleteSchedule(scheduleId);
        return deleteSchedule > 0 ? "删除场次成功" : "删除场次失败";
    }

    /**
     * 修改场次信息
     *
     * @param schedule 场次实体
     * @return 受影响的行数
     */
    @PostMapping("/updateSchedule")
    public String updateSchedule(@RequestBody Schedule schedule) {
        int updateSchedule = scheduleService.updateSchedule(schedule);
        return updateSchedule > 0 ? "修改场次信息成功" : "修改场次信息失败";
    }

    /**
     * 选座位页面的信息显示
     * @param scheduleId 场次id
     * @return jsonObject对象
     */
    @PostMapping("selectScheduleByHallId")
public JSONObject selectScheduleByHallId(@Param("scheduleId") Integer scheduleId) {
    // 打印传入的 scheduleId 用于调试
    System.out.println("scheduleId = " + scheduleId);

        // 创建一个新的 JSON 对象，用于封装返回数据
        JSONObject obj = new JSONObject();

        // 根据传入的 scheduleId 查询对应的场次信息
        Schedule schedule = scheduleService.findScheduleById(scheduleId);

        // 将查询到的场次信息放入 JSON 对象中，键名为 "data"
        obj.put("data", schedule);

        // 返回封装好的 JSON 对象
        return obj;
    }

    /**
     * 分页查询平台场次管理
     * @return rep对象
     */
    @GetMapping("selectSchedule/{page}")
    public Rep selectSchedulePage(@PathVariable("page") int page, @Param("cinemaName") String cinemaName,
                                  @Param("hallName") String hallName) {
        PageHelper.startPage(page, 10);
        //执行查询
        List<Schedule> list = this.scheduleService.selectSchedulePage(cinemaName, hallName);
        PageInfo<Schedule> schedulePageInfo = new PageInfo<>(list);
        return new Rep().addData("schedulePageInfo", schedulePageInfo);
    }

    /**
     * 平台新增场次
     * @param schedule 场次实体
     * @return 字符串提示信息
     */
    @PostMapping("/addSchedule")
    public String addSchedule(@RequestBody Schedule schedule) {
        return this.scheduleService.addSchedule(schedule) > 0 ? "新增成功" : "新增失败";
    }

    /**
     * 平台根据id删除场次
     * @param scheduleId 场次id
     * @return 字符串提示信息
     */
    @GetMapping("/removeScheduleId")
    public String removeScheduleId(Integer scheduleId) {
        return this.scheduleService.removeScheduleId(scheduleId);
    }

    }
